<?php

namespace App\Http\Controllers\Home\Search\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class XunSearchApi extends Controller
{
    protected $xs;

    //模糊搜索
    protected $fuzzy;

    //同义词搜索
    protected $synonyms;

    public $from = null;
    public $to = null;



    /**
     * __construct description
     * @param string  $configFile xunsearch的配置文件名
     * @param boolean $fuzzy      模糊搜索 true为开启 false关闭模糊
     * @param boolean $synonyms   同义词搜索 true为开启
     */
    public function __construct(
      $configFile = 'blog',
      $fuzzy = true,
      $synonyms = true
    )
    {
        //如果要修改ini配置文件的存放路径,请设置XS_APP_ROOT常量即可.如果在laravel是不需要设置的,直接放在vendor/hightman/xunsearch/app的目录底下
        //define ('XS_APP_ROOT', '/usr/local/xunsearch/sdk/php/app');

        $this->xs = new \XS($configFile);
        $this->fuzzy = $fuzzy;
        $this->synonyms = $synonyms;

        //获取搜索对象
        $this->search = $this->xs->search;
    }


    /**
     * doSearch 使用xunsearch进行搜索
     * @author 吴伯恒 
     * @param  string $keyword 搜索词语,这是用户从表单填写的要搜索的内容
     * @param  string $filed 字段名称,如果填写了则按此字段的范围条件进行搜索,范围值由参数3,4决定
     * @param  int $from 范围搜索条件的开始值
     * @param  int $to 范围搜索条件的结束值
     * @return array           搜索结果
     */
    public function doSearch($keyword, $filed = null, $from = null, $to = null)
    {

        $this->search
        ->setFuzzy($this->fuzzy)
        ->setAutoSynonyms($this->synonyms);

        //设置搜索语句
        // $this->search->setQuery($keyword);

        //执行搜索，将搜索结果文档保存在 $docs 数组中
        if ($filed == null) {

            //没有范围条件的搜索:
            $docs =  $this->search->setQuery($keyword)->search();
        } else {

            //有范围条件的搜索:
            $docs =  $this->search->setQuery($keyword)->addRange($filed, $from, $to)->search();
        }

        if(count($docs) == 0){

          // 没有找到搜索结果
          return array();
        }

        //将结果一一取出
            foreach($docs as $k => $doc){
                if(!empty($doc)){

                        //取出搜索结果
                        $searchRes[] = $doc->getFields();

                        //获取每个词的权重
                        $searchRes[$k]['weight'] = $doc->weight();

                }
            }

       return $searchRes;

    }

    /**
     * 计算搜索出来的结果数量
     * @author wuboheng 
     * @return [int] [搜索结果的数量]
     */
    public function countSearchNum()
    {
        return $this->search->count();

    }


    /**
     * addDocumentData 添加数据到xunsearch索引服务器
     * @param array $data 如果需要将商品名加入搜索服务器，就传递
     * $data = ['gname' => '你的商品名'], gname需要与xunsearch配置文件中一致
     *
     * @return  void
     */
    public function addDocumentData( $data = array() )
    {
        if ( empty($data) ) {
          throw new \Exception('请输入插入数据');
        }

        $doc = new \XSDocument;

        $doc->setFields($data);

        //添加索引到xunsearch中
        $this->xs->index->add($doc);
    }

    /**
     * updateDocumentData 更新数据到xunsearch索引服务器
     * @author 吴伯恒
     * @param  array  $data 要更新的商品信息加入索引服务器,此数组的字段,需要与xunsearch配置文件中一致
     * @return void
     */
    public function updateDocumentData( $data = array() )
    {
        if ( empty($data) ) {
          throw new \Exception('请输入插入数据');
        }

        $doc = new \XSDocument;

        $doc->setFields($data);

        //添加索引到xunsearch中
        $this->xs->index->update($doc);
    }


    /**
     * 清除所有索引
     * @author wuboheng
     * @return [void] [description]
     */
    public function cleanIndex()
    {
        // $xs = new \XS('goods'); // 建立 XS 对象，项目名称为：demo
        $index = $this->xs->index; // 获取 索引对象

        $index->clean();
    }

     /**
     * 立即清除所有索引,马上生效
     * @author wuboheng
     * @return [void] [description]
     */
    public function flushIndex()
    {
        // $xs = new \XS('goods'); // 建立 XS 对象，项目名称为：demo
        $index = $this->xs->index; // 获取 索引对象

        $index->flushIndex();
    }

    /**
     * 获取热搜词
     * @return [array] [热搜词]
     */
    public function getHotQuery()
    {   

        $words = $this->search->getHotQuery(); 
        return $words;
    }


}
